#ifndef __BSP_PUBLIC_H
#define __BSP_PUBLIC_H
#include "gd32f30x.h"

#define DEBUG_MODE        0            //  打印模式选择，0：不打印，1：打印
#if (DEBUG_MODE == 1)
#define printf_log(format, ...)   printf(format, ##__VA_ARGS__)
#else
#define printf_log(format, ...)   do{}while(0)
#endif


extern volatile uint64_t driver_tick;

typedef enum {DRV_ERROR = 0, DRV_SUCCESS = !DRV_ERROR} Drv_Err;

typedef struct __typdef_tick_handle{
    uint16_t tick_value;
    void (*tick_task_callback)(void);  
}typdef_tick_handle ;

extern typdef_tick_handle driver_tick_handle[];

/**
 * @brief 通信状态联合体
 *
 * 该联合体用于表示通信的状态。`Com_State` 是一个字节，其中的每一位表示不同的状态标志。
 * `Bits` 结构体用于位域访问这些状态标志。
 */
typedef union  _com_union {
	uint8_t Com_State;         // 通信状态字节
	struct {
		uint8_t RecSuccess: 1; // 接收成功标志
		uint8_t SendSucess: 1; // 发送成功标志
		uint8_t RecState: 1;   // 接收状态标志
		uint8_t SendState: 1;  // 发送状态标志
		uint8_t Dir: 1;        // 方向标志
		uint8_t Unused: 4;     // 未使用位
	} Bits;                    // 位域结构体
} com_union;

/**
 * @brief 通用通信控制结构体
 *
 * 该结构体用于管理通信的控制信息，包括通信状态、接收和发送缓冲区指针、以及接收和发送的大小和计数。
 */
typedef struct __typdef_com_control_general {
	com_union Com_Flag;  // 通信状态联合体
	uint8_t* p_Rec;      // 接收缓冲区指针
	uint8_t* p_Send;     // 发送缓冲区指针
	uint16_t SendSize;   // 发送缓冲区大小
	uint16_t SendCount;  // 已发送数据计数
	uint16_t RecSize;    // 接收缓冲区大小
	uint16_t RecCount;   // 已接收数据计数
} typdef_com_control_general;

/**
 * @brief 通信模式枚举
 *
 * 该枚举定义了不同的通信模式。
 */
typedef enum {
	MODE_POLL,  // 轮询模式
	MODE_DMA,   // DMA模式
	MODE_INT,   // 中断模式
} com_mode_enum;

#endif

